<?php

namespace App\Utils;

class RedisConnect
{
    /**
     * Redis的ip
     * @var string
     */
    const REDIS_HOST_NAME = REDIS_CONFIG_HOST;

    /**
     * Redis的port
     * @var int
     */
    const REDIS_PORT = REDIS_CONFIG_PORT;

    /**
     * Redis的超时时间
     *
     * @var int
     */
    const REDIS_TIMEOUT = REDIS_CONFIG_TIMEOUT;

    /**
     * Redis的password
     *
     * @var unknown_type
     */
    const REDIS_PASSWORD = REDIS_CONFIG_PASSWORD;

    /**
     * Redis的DB name
     *
     * @var int
     */
    const REDIS_DB_NAME = REDIS_CONFIG_DB_NAME;

    /**
     * 类单例
     *
     * @var object
     */
    private static $instance;

    /**
     * Redis的连接句柄
     * @var \Redis
     */
    private $redis;

    /**
     * 私有化构造函数，防止类外实例化
     * RedisConnect constructor.
     */
    private function __construct()
    {
        // 链接数据库
        $this->redis = new \Redis();
        $this->redis->connect(self::REDIS_HOST_NAME, self::REDIS_PORT, self::REDIS_TIMEOUT);
        $this->redis->auth(self::REDIS_PASSWORD);
        $this->redis->select(self::REDIS_DB_NAME);
    }

    /**
     * 私有化克隆函数，防止类外克隆对象
     */
    private function __clone()
    {

    }

    /**
     * 类的唯一公开静态方法，获取类单例的唯一入口
     * @return object|RedisConnect
     */
    public static function getRedisInstance()
    {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 获取redis的连接实例
     * @return object|\Redis
     */
    public function getRedis()
    {
        return $this->redis;
    }

    /**
     * 需要在单例切换的时候做清理工作
     */
    public function __destruct()
    {
        self::$instance->redis->close();
        self::$instance = NULL;
    }
}